﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dominio;
using Persistencia;

namespace Interfaces
{
    public class ImpITanque : ITanque
    {

        public void CrearTanqueCombustible(string descripcion, int capacidad, Contenido nombreContenido, int calidad)
        {
            Sistema sistema = Sistema.GetSistema();
            Tanque tanque = new TanqueCombustible(descripcion, capacidad, nombreContenido, calidad);
            sistema.AgregarTanque(tanque);
            tanque.Create();
        }

        public void CrearTanqueAgua(string descripcion, int capacidad, string ubicacion, int calidad) 
        {
            Sistema sistema = Sistema.GetSistema();
            Tanque tanque = new TanqueAgua(descripcion, capacidad, ubicacion, calidad);
            sistema.AgregarTanque(tanque);
            tanque.Create();
        }

        public void CrearTanqueAceite(string descripcion, int capacidad, int viscocidad, int calidad)
        {
            Sistema sistema = Sistema.GetSistema();
            Tanque tanque = new TanqueAceite(descripcion, capacidad, viscocidad, calidad);
            sistema.AgregarTanque(tanque);
            tanque.Create();
        }   

        public void ModificarDescripcionTanque(Tanque idTanque, string nuevaDescripcion)
        {
            idTanque.Descripcion = nuevaDescripcion;
        }

        public void ModificarLitrosDisponiblesTanque(Tanque idTanque, int nuevaCapacidad)
        {
            idTanque.LitrosDisponibles = nuevaCapacidad;
        }

        public void AgregarSurtidorATanque(TanqueCombustible idTanque, Surtidor idSurtidor)
        {
            Tanque unTanque = BuscarTanquePorId(idTanque);
            Surtidor unSurtidor = BuscarSurtidorPorId(idSurtidor);            
        }

        public Dominio.Tanque BuscarTanquePorId(Tanque idTanque)
        {
            Sistema sistema = Sistema.GetSistema();
            List<Tanque> tanques = sistema.ObtenerTanques();
            foreach (Tanque t in tanques)
            {
                if (t.idTanque == idTanque.idTanque)
                    return t;
            }
            return null;
        }

        public Dominio.Surtidor BuscarSurtidorPorId(Surtidor idSurtidor)
        {
            Sistema sistema = Sistema.GetSistema();
            List<Surtidor> surtidores = sistema.ObtenerSurtidores();
            foreach (Surtidor s in surtidores)
            {
                if (s.IdSurtidor == idSurtidor.GetIdSurtidor())
                    return s;
            }
            return null;

        }

        public Dominio.Surtidor BuscarSurtidorPorIdTodos(Surtidor idSurtidor)
        {
            Sistema sistema = Sistema.GetSistema();
            List<Surtidor> surtidores = sistema.ObtenerTodosSurtidores();
            foreach (Surtidor s in surtidores)
            {
                if (s.IdSurtidor == idSurtidor.GetIdSurtidor())
                    return s;
            }
            return null;

        }


        public Contenido BuscarContenidoPorNombre(string nombreContenido)
        {
            Sistema sistema = Sistema.GetSistema();
            List<Contenido> contenidos = sistema.ObtenerContenidos();
            foreach (Contenido c in contenidos)
            {
                if (nombreContenido == c.Nombre)
                {
                    return c;
                }
            }
            return null;
        }

        public void AgregarMangueraASurtidor(TanqueCombustible idTanque, Surtidor idSurtidor)
        {
            Manguera unaManguera = new Manguera(idTanque, idSurtidor);
            unaManguera.Create();
            idSurtidor.AgregarManguera(unaManguera);
            //idTanque.Notificar();
        }

        void ITanque.EliminarMangueraDeSurtidor(Surtidor idSurtidor, Manguera idManguera)
        {
            idSurtidor.EliminarManguera(idManguera);
            Tanque tanque = idManguera.Tanque;
            //tanque.Notificar();
        }

        public int ObtenerTotalLitrosCargados(Surtidor UnSurtidor, Manguera UnaManguera) {
            Manguera unaManguera = UnSurtidor.BuscarManguera(UnaManguera.IdManguera);
            int total = 0;
            int cantidadExpendidos = unaManguera.Expendidos.Count;
            if (cantidadExpendidos > 0)
            {
                foreach (Expendido e in unaManguera.Expendidos)
                {
                    total += e.CantidadLitros;
                }
            }
            return total;
        }

        private Manguera BuscardMangueraPorId(Surtidor idSurtidor, Manguera idManguera)
        {
            Manguera retorno = null;
            List<Manguera> mangueras = idSurtidor.GetMangueras();
            foreach (Manguera m in mangueras)
            {
                if (m.IdManguera == idManguera.IdManguera)
                {
                    retorno = m;
                }
            }
            return retorno;

        }

        public void EliminarTanque(Tanque idTanque)
        {
            Tanque tanque = BuscarTanquePorId(idTanque);
            foreach (Surtidor s in Sistema.GetSistema().ObtenerSurtidores())
            {
                foreach (Manguera m in s.GetMangueras())
                {
                    if (m.Tanque.idTanque == idTanque.idTanque)
                    {
                        m.Borrado = 1;
                    }
                }
            }
            tanque.Delete();
            Sistema.GetSistema().EliminarTanque(tanque);
            //tanque.Notificar();
        }

        public List<Manguera> ObtenerListaIdsManguerasPorIdSurtidor(Surtidor idSurtidor){
            return idSurtidor.GetMangueras();
        }

        public int ObtenerLitrosDisponiblesTanquePorIdSurtidorYManguera(Surtidor idSurtidor, Manguera idManguera)
        {
            ISurtidor surtidores = new ImpISurtidor();
            ITanque tanques = new ImpITanque();
            Manguera manguera = surtidores.ObtenerMangueraPorIdSurtidorYManguera(idSurtidor, idManguera);
            return manguera.Tanque.LitrosDisponibles ;
        }

        public List<Tanque> ObtenerDatosTanques()
        {
            return Sistema.GetSistema().ObtenerTanques();
            /*
            List<Tanque> listaRetorno = new List<Tanque>();
            Tanque aux = new Tanque();
            List<ObjetoPersistible> lista = aux.Select(aux);
            foreach (Tanque obj in lista)
            {
                listaRetorno.Add(obj);
            }
            return listaRetorno;
            */
        }

        public void AgregarExpendidoAManguera(Manguera UnaManguera, int cantidadLitros, DateTime fechaHora, Cliente idCliente, Surtidor idSurtidor)
        {
            ISurtidor surtidores = new ImpISurtidor();
            ICliente clientes=new ImpICliente();
            Expendido expendido = new Expendido(cantidadLitros, fechaHora, idCliente, UnaManguera);
            expendido.Create();
            UnaManguera.AgregarExpendido(expendido);
            UnaManguera.Tanque.QuitarCombustible(cantidadLitros);
            UnaManguera.Tanque.Update();
        }

        public bool EsCantidadDeLitrosAExpenderValida(Surtidor idSurtidor, Manguera idManguera, int cantidadLitros)
        {
            Manguera unaManguera = BuscardMangueraPorId(idSurtidor, idManguera);
            if (unaManguera.Tanque.LitrosDisponibles >= cantidadLitros)
            {
                return true;
            }
            else
            {
                return false;
            }

        }

        public List<Surtidor> ObtenerIdsSurtidores()
        {
            Sistema sistema = Sistema.GetSistema();
            return sistema.ObtenerSurtidores();
        }

        public void AgregarContenidoATanque(Tanque idTanque, DateTime fechaHora, int cantidadLitros, int idManual) 
        {
            TareaMantenimiento reposicion = new Reposicion(cantidadLitros,idManual, fechaHora);
            reposicion.Tanque = idTanque;
            idTanque.AgregarCombustible(cantidadLitros);
            idTanque.AgregarReposicionCombustible(reposicion);
            reposicion.Create();
        }

        public bool EsCantidadNuevaSuperiorCapacidad(Tanque idTanque, int litros)
        {
            if (idTanque.LitrosDisponibles + litros > idTanque.Capacidad)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        public List<Contenido> ObtenerNombreContenidos()
        {
            Sistema sistema=Sistema.GetSistema();
            return sistema.ObtenerContenidos();
        }
    }
}
